/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.beautycenter.ModelosTabela;

import br.com.beautycenter.DAO.PersistePacoteTratamento;
import br.com.beautycenter.Funcionalidades.Data;
import br.com.beautycenter.Funcionalidades.Validacoes;
import br.com.beautycenter.bean.PacoteTratamento;
import br.com.beautycenter.view.CadastroPacoteAvulso;
import br.com.beautycenter.view.CadastroPacoteLaser;
import br.com.beautycenter.view.CadastroPacotePilates;
import br.com.beautycenter.view.CadastroPacoteTratamento;
import br.com.beautycenter.view.CadastroTratamento;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author magelinha
 */
public class TableModelPacotes extends AbstractTableModel {
    
    List<PacoteTratamento> listaPacote = new ArrayList<PacoteTratamento>();
    PersistePacoteTratamento persistePacote = new PersistePacoteTratamento();
    
    private String[] colunas = new String[]{"Data de Cadastro","Qtd. de Sessões","Total do Pacote", "Total Pago"};
    
    private static final int DATA_CADASTRO = 0;
    private static final int QTD_SESSOES = 1;
    private static final int TOTAL_PACOTE = 2;
    private static final int TOTAL_PAGO = 3;

    @Override
    public int getRowCount() {
        return listaPacote.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(final int rowIndex, int columnIndex) {
        switch(columnIndex){ 
            case DATA_CADASTRO:
                if(listaPacote.get(rowIndex).getDataCriacao() == null) return "";
                return Data.formatoDataConvencional.format(listaPacote.get(rowIndex).getDataCriacao());
                
            case QTD_SESSOES:
                if(listaPacote.get(rowIndex).getListaSessoes() == null) return 0;
                return listaPacote.get(rowIndex).getListaSessoes().size();
                
            case TOTAL_PACOTE:
                return Validacoes.formatoMoeda.format(listaPacote.get(rowIndex).getTotalPacote());
                
            case TOTAL_PAGO:
                return Validacoes.formatoMoeda.format(listaPacote.get(rowIndex).getTotalPago());
                
            default:
                throw new IndexOutOfBoundsException("Não é possivel pegar o valor da coluna desejada");
        }
    }
    
    @Override
    public String getColumnName(int columnIndex){
        return colunas[columnIndex];
    }
    
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        PacoteTratamento pacote = listaPacote.get(rowIndex);
        switch(columnIndex){
            case DATA_CADASTRO:
                try {
                    pacote.setDataCriacao(Data.formatoDataConvencional.parse(aValue.toString()));
                } catch (ParseException ex) {
                    pacote.setDataCriacao(null);
                }
                
            case QTD_SESSOES:
                break;
                
            case TOTAL_PACOTE:
                try{
                    pacote.setTotalPacote(Validacoes.formatoMoeda.parse(aValue.toString()).doubleValue());
                }catch (ParseException ex){
                    pacote.setTotalPacote(0.0);
                }
                break;
            case TOTAL_PAGO:
                try{
                    pacote.setTotalPago(Validacoes.formatoMoeda.parse(aValue.toString()).doubleValue());
                }catch(ParseException ex){
                    pacote.setTotalPacote(0.0);
                }
                
                break;
                
            default:
                throw new IndexOutOfBoundsException("Não é possivel pegar o valor da coluna desejada");
        }
        
        fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula
    }
    
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        return false; //nenhuma célula é editável
    }
    
    @Override
    public Class<?> getColumnClass(int columnIndex){
        switch(columnIndex){
            case DATA_CADASTRO:
                return String.class;
                
            case QTD_SESSOES:
                return Integer.class;
                
            case TOTAL_PACOTE:
                return String.class;
                
            case TOTAL_PAGO:
                return String.class;
                
            default:
                throw new IndexOutOfBoundsException("Coluna não existe na tabela " + columnIndex);
        }
    }
    
    /*
     * Metodos para manipulação de dados
     */
    
    /**
     * Pega a sessão selecionada na tabela
     * @param linha 
     */
    public PacoteTratamento getPacote(int linha){
        return listaPacote.get(linha);
    }
    
    public void addPacote(PacoteTratamento pacote){
        listaPacote.add(pacote);
        
        int ultimo = getRowCount()-1;
        
        fireTableRowsInserted(ultimo, ultimo);
    }
    
    /**
     * Remove uma determinada linha da tabela
     */
    public void removePacotes(int linha){
        listaPacote.remove(linha);
        
        fireTableRowsDeleted(linha, linha);
    }
    
    public void addListaPacotes(List<PacoteTratamento> lista){
        int indice = getRowCount();
        listaPacote.addAll(lista);
        
        fireTableRowsInserted(indice, indice + lista.size());
    }
    
    public void clear(){
        listaPacote.clear();
        fireTableDataChanged();
    }
    
    /**
     * Chama o frame correspondente ao tipo do pacote.
     * @param linha
     * 
     */
    public void exibirPacote(int linha){
        PacoteTratamento pacote = listaPacote.get(linha);
        
        switch(pacote.getTipoPacote()){
            case 1:
                CadastroPacoteTratamento.pacote = pacote;
                CadastroPacoteTratamento.listaSessao = pacote.getListaSessoes();
                CadastroPacoteTratamento.editable = false;
                
                CadastroPacoteTratamento cadastroPacote = new CadastroPacoteTratamento();
                cadastroPacote.ocultarBotoes(); //exibe apenas o sair
                cadastroPacote.ocultarColunas();
                cadastroPacote.setLocationRelativeTo(null);
                cadastroPacote.setVisible(true);
                
                break;
            
            case 2:
                CadastroPacotePilates.pacote = pacote;
                CadastroPacotePilates.listaSessao = pacote.getListaSessoes();
                CadastroPacotePilates.editable = false;
                
                CadastroPacotePilates pilates = new CadastroPacotePilates();
                pilates.ocultarBotoes(); //exibe apenas o sair
                pilates.ocultarColunas();
                pilates.setLocationRelativeTo(null);
                pilates.setVisible(true);
                
                break;
                
            case 3:
                CadastroPacoteLaser.pacote = pacote;
                CadastroPacoteLaser.listaSessao = pacote.getListaSessoes();
                CadastroPacoteLaser.editable = false;
                
                CadastroPacoteLaser laser = new CadastroPacoteLaser();
                laser.ocultarBotoes(); //exibe apenas o sair
                laser.ocultarColunas();
                laser.setLocationRelativeTo(null);
                laser.setVisible(true);
                
                break;
                
            case 4:
                CadastroPacoteAvulso.pacote = pacote;
                CadastroPacoteAvulso.listaSessao = pacote.getListaSessoes();
                CadastroPacoteAvulso.editable = false;
                
                CadastroPacoteAvulso avulso = new CadastroPacoteAvulso();
                avulso.ocultarBotoes(); //exibe apenas o sair
                avulso.ocultarColunas();
                avulso.setLocationRelativeTo(null);
                avulso.setVisible(true);
                
                break;
                
        }
    }
    
}
